import os
import sys
import requests
from PIL import Image
from io import BytesIO

# 将项目根目录添加到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from app import create_app, db
from models import User, Design
from werkzeug.security import generate_password_hash
from datetime import datetime, timedelta
import random

def init_db(app):
    """初始化数据库"""
    with app.app_context():
        # 创建所有表
        db.create_all()
        print("数据库表创建成功！")

def create_test_data(app):
    """创建测试数据"""
    with app.app_context():
        try:
            # 清空现有数据
            Design.query.delete()
            User.query.delete()
            db.session.commit()
            print("已清空现有数据")
            
            # 创建测试用户
            test_user = User(
                username='test_user',
                email='test@example.com',
                password_hash=generate_password_hash('123456'),
                name='测试用户',
                bio='这是一个测试账号'
            )
            db.session.add(test_user)
            db.session.commit()
            print("测试用户创建成功")

            # 设计案例分类
            categories = ['居住区景观', '公园设计', '商业景观', '校园景观']
            
            # 示例标签
            tag_pool = [
                '现代风格', '中式园林', '生态设计', '休闲空间', 
                '水景设计', '屋顶花园', '庭院设计', '广场设计',
                '植物配置', '景观小品', '照明设计', '可持续设计'
            ]

            # 创建20个测试案例
            for i in range(1, 21):
                # 随机选择2-4个标签
                tags = ','.join(random.sample(tag_pool, random.randint(2, 4)))
                
                # 随机生成浏览量和点赞数
                views = random.randint(100, 1000)
                likes = random.randint(10, views//10)
                
                # 随机生成创建时间（最近30天内）
                created_at = datetime.utcnow() - timedelta(
                    days=random.randint(0, 30),
                    hours=random.randint(0, 23),
                    minutes=random.randint(0, 59)
                )
                
                design = Design(
                    title=f'示例景观设计案例 {i}',
                    category=random.choice(categories),
                    description=f'''这是一个示例景观设计案例的简介。本案例展示了现代景观设计的创新理念，
                    融合了自然元素与人文特色，打造出独具特色的景观空间。案例包含了详细的设计思路、
                    空间布局、植物配置等内容。''',
                    content=f'''
                    <h3>项目背景</h3>
                    <p>本项目位于城市核心区域，总面积约5000平方米。业主要求打造一个既能满足日常使用
                    需求，又能体现现代设计美感的景观空间。</p>
                    
                    <h3>设计理念</h3>
                    <p>设计以"自然融合"为核心理念，通过现代手法诠释传统园林元素，创造出简约而不失
                    韵味的景观空间。主要运用了以下设计手法：</p>
                    <ul>
                        <li>空间的序列化组织</li>
                        <li>自然元素的巧妙运用</li>
                        <li>现代材料与传统元素的结合</li>
                        <li>可持续设计策略的应用</li>
                    </ul>
                    
                    <h3>空间布局</h3>
                    <p>项目分为以下几个功能区：</p>
                    <ul>
                        <li>入口广场区</li>
                        <li>中央活动区</li>
                        <li>休闲娱乐区</li>
                        <li>生态观赏区</li>
                    </ul>
                    
                    <h3>植物配置</h3>
                    <p>植物选择以乡土树种为主，搭配四季花卉，营造丰富的植物层次。主要植物包括：</p>
                    <ul>
                        <li>乔木：香樟、银杏、栾树</li>
                        <li>灌木：红叶石楠、茶梅、月季</li>
                        <li>地被：麦冬、玉簪、鸢尾</li>
                    </ul>''',
                    cover_image=f'/static/images/design-{random.randint(1, 5)}.jpg',
                    images='/static/images/design-1.jpg,/static/images/design-2.jpg,/static/images/design-3.jpg',
                    tags=tags,
                    views=views,
                    likes=likes,
                    user_id=test_user.id,
                    status='published',
                    created_at=created_at,
                    updated_at=created_at
                )
                db.session.add(design)
                
            db.session.commit()
            print(f"已创建 {Design.query.count()} 个设计案例")
            print("\n初始化完成！")
            print(f"测试用户 - 用户名：test_user，密码：123456")
            
        except Exception as e:
            print(f"错误：{str(e)}")
            db.session.rollback()
            raise

def prepare_sample_images(app):
    """准备示例图片"""
    # 创建必要的目录
    static_dir = os.path.join(app.root_path, 'static')
    images_dir = os.path.join(static_dir, 'images')
    os.makedirs(images_dir, exist_ok=True)
    
    # 更新后的示例图片URLs
    image_urls = [
        'https://images.unsplash.com/photo-1558036117-15d82a90b9b1?auto=format&fit=crop&w=800&q=80',  # 园林景观
        'https://images.unsplash.com/photo-1564013799919-ab600027ffc6?auto=format&fit=crop&w=800&q=80',  # 公园
        'https://images.unsplash.com/photo-1607619056574-7b8d3ee536b2?auto=format&fit=crop&w=800&q=80',  # 庭院
        'https://images.unsplash.com/photo-1601439678777-b2b3c56fa627?auto=format&fit=crop&w=800&q=80',  # 广场
        'https://images.unsplash.com/photo-1613977257363-707ba9348227?auto=format&fit=crop&w=800&q=80',  # 花园
    ]
    
    print("开始下载示例图片...")
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    
    # 下载并保存图片
    for i, url in enumerate(image_urls, 1):
        try:
            # 下载图片
            response = requests.get(url, headers=headers)
            response.raise_for_status()
            
            # 使用Pillow处理图片
            img = Image.open(BytesIO(response.content))
            
            # 调整图片大小
            img = img.resize((800, 600), Image.Resampling.LANCZOS)
            
            # 保存图片
            img_path = os.path.join(images_dir, f'design-{i}.jpg')
            img.save(img_path, 'JPEG', quality=85)
            
            print(f"已下载并保存图片: design-{i}.jpg")
            
        except Exception as e:
            print(f"下载图片 {i} 失败: {str(e)}")
            continue
    
    print("示例图片准备完成！")

def main():
    """主函数"""
    try:
        # 创建应用实例
        app = create_app()
        
        # 准备示例图片
        prepare_sample_images(app)
        
        # 初始化数据库
        init_db(app)
        
        # 创建测试数据
        create_test_data(app)
        
    except Exception as e:
        print(f"初始化失败：{str(e)}")
        sys.exit(1)

if __name__ == '__main__':
    main() 